package com.example.mapper;

import com.example.entity.RechargeRecord;
import com.example.dto.RechargeRecordQueryDTO;
import com.example.vo.RechargeRecordVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.List;

@Mapper
public interface RechargeRecordMapper {
    
    // 基础CRUD操作
    int insert(RechargeRecord rechargeRecord);
    
    int deleteById(Long id);
    
    int updateById(RechargeRecord rechargeRecord);
    
    RechargeRecord selectById(Long id);
    
    List<RechargeRecord> selectList(@Param("rechargeRecord") RechargeRecord rechargeRecord);
    
    // 根据订单号查询
    RechargeRecord selectByOrderNo(@Param("orderNo") String orderNo);
    
    // 根据用户ID查询充值记录
    List<RechargeRecord> selectByUserId(@Param("userId") Long userId);
    
    // 条件查询充值记录VO
    List<RechargeRecordVO> selectVOList(@Param("query") RechargeRecordQueryDTO query);
    
    // 分页查询充值记录VO
    List<RechargeRecordVO> selectVOPage(@Param("query") RechargeRecordQueryDTO query, 
                                       @Param("offset") int offset, 
                                       @Param("limit") int limit);
    
    // 统计查询条件下的总数
    long selectCountByQuery(@Param("query") RechargeRecordQueryDTO query);
    
    // 根据用户ID统计充值总金额
    BigDecimal selectTotalRechargeByUserId(@Param("userId") Long userId);
    
    // 根据用户ID和状态统计充值总金额
    BigDecimal selectTotalRechargeByUserIdAndStatus(@Param("userId") Long userId, 
                                                   @Param("status") Integer status);
    
    // 统计今日充值总金额
    BigDecimal selectTodayTotalRecharge();
    
    // 统计今日充值总笔数
    long selectTodayTotalCount();
    
    // 根据时间范围统计充值金额
    BigDecimal selectTotalRechargeByDateRange(@Param("startTime") String startTime, 
                                             @Param("endTime") String endTime);
    
    // 根据时间范围统计充值笔数
    long selectTotalCountByDateRange(@Param("startTime") String startTime, 
                                    @Param("endTime") String endTime);
}
